package com.maishi.programmer.weiyunsuan;

/**
 * Created by brossdong on 2018/3/21.
 * 实现一个函数，输入一个整数，输出该数二进制表示中 1 的个数。
 * 例如 把 9 表示成二进制是 1001;有 2 位是 1，因此如果输入 9，函数输出 2.
 */
public class TestWeiyunsaun {

    /**
     * 避免死循环
     */
    /***
     * 一个二进制数1100，从右边数起第三位是处于最右边的一个1。
     * 减去1后，第三位变成0，它后面的两位0变成了1，而前面的1保持不变，
     * 因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。
     * 这个时候如果我们再把原来的整数和减去1之后的结果做与运算，
     * 从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.
     * 也就是说，把一个整数减去1，再和原整数做与运算，会把该整数最右边一个1变成0.
     * 那么一个整数的二进制有多少个1，就可以进行多少次这样的操作。
     * @param n
     * @return
     */
    /*public static int NumberOf1 (int n) {
        int num = 0;
        while (n != 0) {
            n = n&(n-1);
            num++;
        }
        return num;
    }*/


    public static int NumberOf1(int n) {
        int count = 0;
        while (n != 0) {
            ++count;
            n = (n - 1) & n;
        }
        return count;
    }

    public static void main(String args[]) {
        int i = TestWeiyunsaun.NumberOf1(9);
        System.out.println(i);
    }
}
